 #include "serialmanager.h"

// 静态成员变量，必须在类外单独定义
SerialManager* SerialManager::m_instance = nullptr;

SerialManager::SerialManager(QObject *parent) : QObject{parent}
{
    serial = new QSerialPort(this);

    // 核心连接：串口数据到达 → 触发信号
    connect(serial, &QSerialPort::readyRead, this, [this](){
        emit dataReceived(serial->readAll());
    });
}


SerialManager *SerialManager::instance()
{
    if (!m_instance) {
        m_instance = new SerialManager();
    }
    return m_instance;
}

/**
 * 打开串口
 * @brief SerialManager::openPort
 * @param portName
 * @param baudRate
 * @return
 */
bool SerialManager::openPort(const QString &portName, int baudRate)
{
    serial->setPortName(portName); // 串口名称
    serial->setBaudRate(baudRate); // 波特率
    serial->setDataBits(QSerialPort::Data8); // 数据位
    serial->setParity(QSerialPort::NoParity); // 校验位
    serial->setStopBits(QSerialPort::OneStop); // 停止位
    serial->setFlowControl(QSerialPort::NoFlowControl); // 流控制

    // 尝试以读写模式打开串口
    if(!serial->open(QIODevice::ReadWrite))
    {
        emit errorOccurred(serial->errorString());
        return false;
    }

    return true;
}

/** 关闭串口
 * @brief SerialManager::closePort
 */
void SerialManager::closePort()
{
    if(serial->isOpen())
    {
        serial->close();
    }
}

/**
 * 发送数据
 * @brief SerialManager::sendData
 * @param data
 */
void SerialManager::sendData(const QByteArray &data)
{
    if (serial->isOpen())
    {
        serial->write(data);
    }
}

